/**
 * @file uart_interface.h
 * @brief UART通信接口模块头文件
 * @author 通信接口功能集成
 * @date 2024-07-07
 */

#ifndef _UART_INTERFACE_H
#define _UART_INTERFACE_H

#include "sdk_project_config.h"
#include "peripherals_uart_2_config.h"
#include "peripherals_uart_5_config.h"
#include "../ESWIN_SDK/log/include/log.h"

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

// 配置参数
#define UART_RX_BUFFER_SIZE      256   // 增大UART接收缓冲区大小以适应视觉模块的数据
#define UART5_TO_UART2_FORWARD_ENABLED  1   // 是否启用UART5数据转发到UART2

/**
 * @brief UART通信接收模式
 * UART模块使用两阶段接收策略:
 * 1. 批量读取模式 - 尝试一次性读取大量数据以处理视觉模块的数据包
 * 2. 标准接收模式 - 用于检测数据包起始符'$'
 * 3. 密集接收模式 - 在检测到'$'后激活，持续接收直到数据包完整
 *
 * 数据包格式:
 * - 视觉定位数据: "$POS,position,centerX,centerY,angle,distance,skew#"
 * - 单字符命令: '1'-'9'表示位置编号
 */

/**
 * @brief 初始化UART模块
 */
void UART_Interface_Init(void);

/**
 * @brief UART接收循环，处理接收到的数据
 */
void UART_ReceiveLoop(void);

/**
 * @brief 通过UART发送字符串
 * @param instance UART实例编号
 * @param str 要发送的字符串
 */
void UART_SendString(uint32_t instance, const char* str);

/**
 * @brief 通过UART发送二进制数据
 * @param instance UART实例编号
 * @param data 要发送的数据
 * @param length 数据长度
 */
void UART_SendData(uint32_t instance, const uint8_t* data, size_t length);

/**
 * @brief 处理UART接收到的数据
 * @param data 接收到的数据
 * @param length 数据长度
 */
void UART_ProcessData(uint8_t* data, size_t length);

/**
 * @brief 设置UART5到UART2的转发
 * @param enable 是否启用转发功能 (1=启用, 0=禁用)
 */
void UART_SetForwarding(uint8_t enable);

/**
 * @brief 重新初始化UART5接收器
 * 当检测到接收问题时，重置UART5
 */
void UART_ReinitReceiver(void);

/**
 * @brief 发送测试数据给视觉模块，验证通信
 * 发送测试命令请求数据
 */
void UART_SendTestData(void);

#endif /* _UART_INTERFACE_H */ 